home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Games / MAME / src / machine / ticket.c < prev    next >
C/C++ Source or Header  |  2000-04-23  |  3KB  |  130 lines

  1. /***************************************************************************
  2.  
  3.   machine.c
  4.  
  5.   Functions to emulate a prototypical ticket dispenser hardware.
  6.  
  7.   Right now, this is an *extremely* basic ticket dispenser.
  8.   TODO:    Active Bit may not be Bit 7 in all applications.
  9.           Add a ticket dispenser interface instead of passing a bunch
  10.         of arguments to ticket_dispenser_init.
  11.         Add sound, graphical output?
  12. ***************************************************************************/
  13.  
  14. #include "driver.h"
  15. #include "machine/ticket.h"
  16.  
  17. /*#define DEBUG_TICKET*/
  18.  
  19. extern unsigned int dispensed_tickets;
  20.  
  21. static int status;
  22. static int power;
  23. static int time_msec;
  24. static int motoron;
  25. static int ticketdispensed;
  26. static int ticketnotdispensed;
  27. static void *timer;
  28.  
  29. static int active_bit = 0x80;
  30.  
  31. /* Callback routine used during ticket dispensing */
  32. static void ticket_dispenser_toggle(int parm);
  33.  
  34.  
  35. /***************************************************************************
  36.   ticket_dispenser_init
  37.  
  38. ***************************************************************************/
  39. void ticket_dispenser_init(int msec, int motoronhigh, int statusactivehigh)
  40. {
  41.     time_msec          = msec;
  42.     motoron            = motoronhigh  ? active_bit : 0;
  43.     ticketdispensed    = statusactivehigh ? active_bit : 0;
  44.     ticketnotdispensed = ticketdispensed ^ active_bit;
  45.  
  46.     status = ticketnotdispensed;
  47.     dispensed_tickets = 0;
  48.     power  = 0x00;
  49. }
  50.  
  51. /***************************************************************************
  52.   ticket_dispenser_r
  53. ***************************************************************************/
  54. READ_HANDLER( ticket_dispenser_r )
  55. {
  56. #ifdef DEBUG_TICKET
  57.     logerror("PC: %04X  Ticket Status Read = %02X\n", cpu_get_pc(), status);
  58. #endif
  59.     return status;
  60. }
  61.  
  62. /***************************************************************************
  63.   ticket_dispenser_w
  64. ***************************************************************************/
  65. WRITE_HANDLER( ticket_dispenser_w )
  66. {
  67.     /* On an activate signal, start dispensing! */
  68.     if ((data & active_bit) == motoron)
  69.     {
  70.         if (!power)
  71.         {
  72. #ifdef DEBUG_TICKET
  73.             logerror("PC: %04X  Ticket Power On\n", cpu_get_pc());
  74. #endif
  75.             timer = timer_set (TIME_IN_MSEC(time_msec), 0, ticket_dispenser_toggle);
  76.             power = 1;
  77.  
  78.             status = ticketnotdispensed;
  79.         }
  80.     }
  81.     else
  82.     {
  83.         if (power)
  84.         {
  85. #ifdef DEBUG_TICKET
  86.             logerror("PC: %04X  Ticket Power Off\n", cpu_get_pc());
  87. #endif
  88.             timer_remove(timer);
  89.             osd_led_w(2,0);
  90.             power = 0;
  91.         }
  92.     }
  93. }
  94.  
  95.  
  96. /***************************************************************************
  97.   ticket_dispenser_toggle
  98.  
  99.   How I think this works:
  100.   When a ticket dispenses, there is N milliseconds of status = high,
  101.   and N milliseconds of status = low (a wait cycle?).
  102. ***************************************************************************/
  103. static void ticket_dispenser_toggle(int parm)
  104. {
  105.  
  106.     /* If we still have power, keep toggling ticket states. */
  107.     if (power)
  108.     {
  109.         status ^= active_bit;
  110. #ifdef DEBUG_TICKET
  111.         logerror("Ticket Status Changed to %02X\n", status);
  112. #endif
  113.         timer = timer_set (TIME_IN_MSEC(time_msec), 0, ticket_dispenser_toggle);
  114.     }
  115.  
  116.     if (status == ticketdispensed)
  117.     {
  118.         osd_led_w(2,1);
  119.         dispensed_tickets++;
  120.  
  121. #ifdef DEBUG_TICKET
  122.         logerror("Ticket Dispensed\n");
  123. #endif
  124.     }
  125.     else
  126.     {
  127.         osd_led_w(2,0);
  128.     }
  129. }
  130.